#include <iostream>
#include <vector>
// 2
int func()
{
    std::cout << "func" << std::endl;
    return 10;
}

// decltype 后置 返回值auto
template <typename T1, typename T2>
auto add(const T1 &a, const T2 &b)->decltype(a + b)   // 14之后可以省略后置
{
    return a + b;
}

int main()
{
    // 自动推导表达式类型
    // 1、不需要初始化
    // 2、可以推导出引用&类型 decltype(a += 1) b; 因为a += 1是左值
    // 3、推导表达式不会真的计算执行
    // 4、左值推引用类型，右值推变量
    // int a = 10;
    // decltype(a += 2) b = a;      // b引用a
    // std::cout << a << std::endl; // 输出a = 10

    // 5、直接用函数调用来推导类型，函数不会执行
    int a = 10;
    decltype(func()) b;        
    std::cout << a << std::endl;

    // 建议使用场景：需要一个类型，但是不想发生拷贝(用auto会发生拷贝)
    // std::vector<int> a;
    // decltype(a) b;

    return 0;
}
